package com.csii.adhoc.controller.dataReady;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.csii.adhoc.dataready.TMgnDirPo;
//import net.sf.json.JSONArray;

import java.util.ArrayList;
import java.util.List;

/*思路：
①、取出数据中的所有父节点放入一个集合中
②、取出数据中所有为该父节点的子节点放入另一个集合中
③、用到迭代的方法将子节点一层一层的遍历*/
public class TreeBuilder {
        List<TMgnDirPo> nodes = new ArrayList<TMgnDirPo>();

        public TreeBuilder(List<TMgnDirPo> nodes) {
            super();
            this.nodes= nodes;
        }

        /**
         * 构建JSON树形结构
         * @return
         */
        public JSONArray buildJSONTree() {
            List<TMgnDirPo> nodeTree = buildTree();
//            JSONArray jsonArray = JSONArray.fromObject(nodeTree);
            JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(nodeTree));
            return jsonArray;
        }

        /**
         * 构建树形结构
         * @return
         */
        public List<TMgnDirPo> buildTree() {
            List<TMgnDirPo> treeNodes = new ArrayList<TMgnDirPo>();
            List<TMgnDirPo> rootNodes = getRootNodes();
            for (TMgnDirPo rootNode : rootNodes) {
                buildChildNodes(rootNode);
                treeNodes.add(rootNode);
            }
            return treeNodes;
        }

        /**
         * 递归子节点
         * @param node
         */
        public void buildChildNodes(TMgnDirPo node) {
            List<TMgnDirPo> children = getChildNodes(node);
            if (!children.isEmpty()) {
                for(TMgnDirPo child : children) {
                    buildChildNodes(child);
                }
                node.setChildren(children);
            }
        }

        /**
         * 获取父节点下所有的子节点
         * @param pnode
         * @return
         */
        public List<TMgnDirPo> getChildNodes(TMgnDirPo pnode) {//传入父节点对象，如果为该父节点的子节点，则放入子节点集合中
            List<TMgnDirPo> childNodes = new ArrayList<TMgnDirPo>();
            for (TMgnDirPo n : nodes){//从nodes中筛选所以为pnode的子节点
                if (pnode.getMenuId().equals(n.getParentId())) {
                    childNodes.add(n);
                }
            }
            return childNodes;
        }

        /**
         * 判断是否为根节点
         * @param node
         * @return
         */
        public boolean rootNode(TMgnDirPo node) {
            boolean isRootNode = true;
            for (TMgnDirPo n : nodes){//从nodes中筛选所以父节点
                if (node.getParentId().equals(n.getMenuId())) {//判断传入的node对象中，他的上级成员编号还有没有node中的成员编号与之对应，如果没有，则为根节点
                    isRootNode= false;
                    break;
                }
            }
            return isRootNode;
        }

        /**
         * 获取集合中所有的根节点
         * @return
         */
        public List<TMgnDirPo> getRootNodes() {
            List<TMgnDirPo> rootNodes = new ArrayList<TMgnDirPo>();
            for (TMgnDirPo n : nodes){
                if (rootNode(n)) {
                    rootNodes.add(n);//把所以的根节点放入rootNodes集合中
                }
            }
            return rootNodes;
        }
}